# nacos注册中心信息
"""将服务注册到注册中心
注册说明：将http://127.0.0.1:8085/**这个服务上的所有服务注册到注册中心，并且起名叫做algorithm-service
其他微服务进行访问时，访问http://algorithm-service/**即可，即其他服务，使用algorithm-service去注册中心，寻找真实的ip地址
例如原本访问 post访问：http://127.0.0.1:8085/simulation/analysis 此时变成 http://algorithm-service/simulation/analysis
"""
import threading
import time

import requests

# 172.2.20.233:8848/nacos/v1/ns/instance/beat?serviceName=sdtm-generate-service&ip=127.0.0.1&port" "=5000&namespace=test
# 心跳时间
HEARTBEATS_TIME = 10
# Nacos地址
NACOS_URL = 'http://127.0.0.1:9010/nacos'
# NACOS_URL = 'http://192.168.233.1:8848/nacos'
# 服务注册路由
NACOS_REGISTER_URL = 'v1/ns/instance'
# 心跳检测路由
NACOS_HEARTBEATS_URL = 'v1/ns/instance/beat'
# nacos命名空间
NAMESPACE_ID = 'public'
# 服务名称
SERVICE_NAME = 'sdtm-generate-service'
# Kubernetes服务的DNS名称, 在k8s上ip地址会随时变化，所以ip地址需要换成域名
IP = '127.0.0.1'
# IP = '127.0.0.1'
PORT = 8080


# Nacos服务注册
def service_register():
    """
    Nacos服务注册的接口有以下参数：
    ip          服务实例IP
    port        服务实例port
    namespaceId 命名空间ID
    weight      权重
    enabled     是否上线
    healthy     是否健康
    metadata    扩展信息
    clusterName 集群名
    serviceName 服务名
    groupName   分组名
    ephemeral   是否临时实例
    :return:
    """
    # 返回参数
    result = {
        "code": 200,
        "message": "success"
    }
    # 构造请求参数
    params = {
        'serviceName': SERVICE_NAME,
        'ip': IP,
        'port': PORT,
        'namespaceId': NAMESPACE_ID
    }
    response = requests.post(
        "{NACOS_URL}/{NACOS_REGISTER_URL}".format(NACOS_URL=NACOS_URL, NACOS_REGISTER_URL=NACOS_REGISTER_URL),
        params=params)
    if response.status_code != 200:
        result["code"] = response.status_code
        result["message"] = "服务注册Nacos失败，失败原因：{error_message}".format(error_message=response.text)
        return result
    if response.text != 'ok':
        result["code"] = 500
        result["message"] = "服务注册Nacos失败，失败原因：{error_message}".format(error_message=response.text)
        return result
    print("服务成功注册在naocs:" + NACOS_URL)
    return result


# 服务心跳检测
def service_beat():
    """
    服务心跳，默认是5s一次
    :return:
    nacos的服务心跳接口有以下参数
    serviceName 服务名
    ip          服务实例IP
    port        服务实例PORT
    namespaceId 命名空间ID
    groupName   分组名
    ephemeral   是否临时实例
    beat        实例心跳内容
    """
    # 构造请求参数
    params = {
        'serviceName': SERVICE_NAME,
        'ip': IP,
        'port': PORT,
        'namespaceId': NAMESPACE_ID
    }
    while True:
        response = requests.put(
            "{NACOS_URL}/{NACOS_HEARTBEATS_URL}".format(NACOS_URL=NACOS_URL, NACOS_HEARTBEATS_URL=NACOS_HEARTBEATS_URL),
            params=params)
        # print("已注册服务，执行心跳服务，续期服务响应状态： {status_code}".format(status_code=response.status_code))
        time.sleep(HEARTBEATS_TIME)


# 通过服务名称获取服务实例
def get_service_instance(service_name):
    params = {
        'namespaceId': NAMESPACE_ID,
        'serviceName': service_name
    }
    # 服务注册路由
    # NACOS_URL = 'http://172.2.20.233:8848/nacos'
    # NACOS_REGISTER_URL = 'v1/ns/instance'
    response = requests.get(f"{NACOS_URL}/{NACOS_REGISTER_URL}/list", params=params)
    if response.status_code == 200:
        data = response.json()
        if data['hosts']:
            # 假设选择第一个可用的服务实例
            return data['hosts'][0]
    return None


# 调用服务
def call_service(ip, port, endpoint):
    url = f"http://{ip}:{port}/{endpoint}"
    print(url)
    response = requests.get(url)
    return response.json()


if __name__ == '__main__':
    # 示例用法
    service_register() # 注册服务
    # 5秒以后，异步执行service_beat()方法
    threading.Timer(HEARTBEATS_TIME, service_beat).start()  # 启动心跳检测
    service_name = 'aviator-service'
    service_instance = get_service_instance(service_name)  # 获取服务实例
    if service_instance:
        print("服务地址:", service_instance['ip'], "服务端口:", service_instance['port'])

    # 调用服务示例
    endpoint = 'aviator-service/healthCheck'  # 服务端点
    result = call_service(service_instance['ip'], service_instance['port'], endpoint)
    print("调用结果:", result)

